package mjc.tds;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;

public class Signature extends ArrayList<Info_Variable> implements Serializable{
	private static final long serialVersionUID = 1L;

	public boolean equals(Object autre){
		if(this == autre){
			return true;
		}
		if((autre == null) || (autre.getClass() != this.getClass())){
			return false;
		}
		
		if(this.size()!=((Signature)autre).size()){
			return false;
		}

		for(int i = 0 ; i<this.size() ; i++){
			if(!this.get(i).getType().equals(((Signature)autre).get(i).getType())){
				return false;
			}
		}
		
		return true;
	}
	
	public int hashCode(){
		return this.size();
	}
	
	public boolean canBeCastedTo(Signature candidate){
		if(this.size() == candidate.size()){
			for(int i=0;i<this.size();i++){
				Type typeDepart = ((Info_Variable)this.get(i)).getType();
				Type typeArrivee = ((Info_Variable)candidate.get(i)).getType();
				if(typeDepart.isBasic()){
					if(!typeArrivee.isBasic()){
						return false;
					}
				}
				else{
					if(typeArrivee.isBasic()){
						return false;
					}
					else{
						if(!typeDepart.getClasse().isAChildOf(typeArrivee.getClasse())){
							return false;
						}
					}
				}
			}
			return true;
		}
		else{
			return false;
		}
	}
	
	public String toString(){
		String retour = "(";
		Iterator<Info_Variable> iterateur = this.iterator();
		boolean first = true;
		while(iterateur.hasNext()){
			retour = retour + (first?"":",") + ((Info_Variable)iterateur.next()).getType().getNom();
			first = false;
		}
		return retour + ")";
	}
	
	public void ajouterToutes(Signature signature){
		for(int i = 0 ; i<signature.size() ; i++){
			this.add(signature.get(i));
		}
	}
	
	/**
	 * Calcule la taille de la memoire necessaire pour stoquer les parametres d'une methode dans la pile 
	 * @return		taille
	 */
	public int getTailleParams()
	{
		int t = 0;
		for(Info_Variable i: this)
		{
			t += i.getType().getTaille();
		}
		return t;
	}
	
	public String getListTypesParams(){
		String params = "";
		for(Iterator iter = this.iterator() ; iter.hasNext();){
			params+=((Info_Variable)iter.next()).getType().getNom();
		}
		return params;
	}
}
